import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:permission_handler/permission_handler.dart';

import '../../utils/http.dart';
import '../../utils/toast.dart';

class LocationList extends StatefulWidget {
  const LocationList({super.key});

  @override
  State<LocationList> createState() => _LocationListState();
}

class _LocationListState extends State<LocationList> {
  // 逆地理编码地址结果
  String address = '';

  // 附近小区列表
  List nearbyCommunities = [];

// 搜索周边小区
  Future<void> _searchPlaceAround(double longitude, double latitude) async {
    try {
      final response = await http.get(
        // 周边搜索API服务地址
        'https://restapi.amap.com/v3/place/around',
        params: {
          'key': '7fbc8f5f29f52c8dac93af039675a66d',
          'location': '$longitude,$latitude',
          'keywords': '住宅小区',
          'radius': 500
        },
      );
      // print(response);
      setState(() {
        // 保存列表
        nearbyCommunities = response['pois'];
      });
    } catch (e) {
      print(e);
    }
  }

// 逆地理编码
  Future<void> _reverseGeocoding(double longitude, double latitude) async {
    try {
      final response = await http.get(
        // 逆地理编码 API 服务地址
        'https://restapi.amap.com/v3/geocode/regeo',
        // 请求参数
        params: {
          // 高德地图官网开发者控制台申请的密钥
          'key': '66964c04021726052d94053049f7bb54',
          // 经度在前，纬度在后，经纬度间以“,”分割
          'location': '$longitude,$latitude',
          // 搜索半径
          'radius': 500,
          // 搜索类型
          'type': '住宅小区'
        },
      );
      // print(response);
      // 更新地址信息
      setState(() {
        address = response['regeocode']['formatted_address'];
        // print(address.toString());
      });
    } catch (e) {
      print('_reverseGeocoding 逆地理编码 error');
      print(e);
    }
  }

  Future<void> requestLocationPermission() async {
    PermissionStatus status = await Permission.location.request();
    if (status.isGranted) {
      // 权限未授予
      // ToastUtil.showSuccess('位置权限授予');
      // 获取当前位置
      getCurrentLocation();
    } else {
      // 权限未授予
      ToastUtil.showError('位置权限未授予, 请去设置中心开启');
    }
  }

  /// 异步获取当前设备的位置信息。
  ///
  /// 此方法首先根据设备的平台（Android、iOS/macOS 或 Web）配置不同的定位设置，
  /// 然后使用这些设置获取设备的当前位置，并处理位置信息或异常。
  Future<void> getCurrentLocation() async {
    late LocationSettings locationSettings;

    if (defaultTargetPlatform == TargetPlatform.android) {
      // 针对Android平台，设置高精度定位、100米距离过滤、强制使用位置管理器等
      locationSettings = AndroidSettings(
          accuracy: LocationAccuracy.high,
          distanceFilter: 100,
          forceLocationManager: true,
          intervalDuration: const Duration(seconds: 10),
          foregroundNotificationConfig: const ForegroundNotificationConfig(
            notificationText:
                "Example app will continue to receive your location even when you aren't using it",
            notificationTitle: "Running in Background",
            enableWakeLock: true,
          ));
    } else if (defaultTargetPlatform == TargetPlatform.iOS ||
        defaultTargetPlatform == TargetPlatform.macOS) {
      // 针对iOS和macOS平台，设置高精度定位、健身活动类型、100米距离过滤等
      locationSettings = AppleSettings(
        accuracy: LocationAccuracy.high,
        activityType: ActivityType.fitness,
        distanceFilter: 100,
        pauseLocationUpdatesAutomatically: true,
        // 只有在应用在后台启动时才设置为true
        showBackgroundLocationIndicator: false,
      );
    } else if (kIsWeb) {
      // 针对Web环境，设置高精度定位、100米距离过滤、5分钟的最大年龄等
      // locationSettings = WebSettings(
      //   accuracy: LocationAccuracy.high,
      //   distanceFilter: 100,
      //   maximumAge: const Duration(minutes: 5),
      // );
    } else {
      // 对于其他平台，默认设置高精度定位和100米距离过滤
      locationSettings = const LocationSettings(
        accuracy: LocationAccuracy.high,
        distanceFilter: 100,
      );
    }

    try {
      // 申请权限
      await Geolocator.requestPermission();

      // 使用配置好的定位设置获取当前位置
      // Position position = await Geolocator.getCurrentPosition(); // 无法正常运行
      // 显示成功获取到的纬度和经度
      // ToastUtil.showSuccess('${position.longitude}, ${position.latitude}');
      // print('${position.longitude}, ${position.latitude}');
      // 逆地理编码 -> 把经纬度转换成地址信息
      // _reverseGeocoding(40.065956, 116.350077);
      _reverseGeocoding(116.343314, 40.06023);
      // 搜索周边小区
      _searchPlaceAround(116.343314, 40.06023);
    } catch (e) {
      // 处理可能出现的异常
      // print(e.toString());
      ToastUtil.showError(e.toString());
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // 申请定位权限
    requestLocationPermission();
    if (!kIsWeb) {
      requestLocationPermission();
    } else {
      getCurrentLocation();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('选择社区'),
      ),
      body: ListView(
        padding: const EdgeInsets.all(10),
        children: [
          const Row(
            children: [
              Text(
                '当前地址',
                style: TextStyle(color: Colors.grey),
              )
            ],
          ),
          const SizedBox(height: 10),
          Container(
            color: Colors.white,
            padding: const EdgeInsets.all(10),
            child: Row(
              children: [
                Expanded(child: Text('${address}')),
                Row(
                  children: [
                    const Icon(Icons.location_searching_outlined,
                        color: Colors.blue),
                    const SizedBox(width: 2),
                    GestureDetector(
                      onTap: () {
                        try {
                          getCurrentLocation();
                          // _searchPlaceAround(116.343314, 40.06023);
                        } catch (e) {
                          // print(e);
                        }
                      },
                      child: const Text(
                        '重新定位',
                        style: TextStyle(color: Colors.blue),
                      ),
                    ),
                  ],
                )
              ],
            ),
          ),
          const SizedBox(height: 10),
          const Row(
            children: [
              Text(
                '附近社区',
                style: TextStyle(color: Colors.grey),
              )
            ],
          ),
          const SizedBox(height: 10),
          ListView(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(),
              children: nearbyCommunities.map((item) {
                return GestureDetector(
                  onTap: () {
                    print('111');
                    Navigator.pushNamed(
                      context,
                      '/building_list',
                      arguments: {'point': item['name']},
                    );
                  },
                  child: Container(
                    color: Colors.white,
                    padding: const EdgeInsets.all(10),
                    child: Row(
                      children: [
                        Expanded(child: Text('${item['address']}')),
                        const Row(
                          children: [
                            Icon(Icons.arrow_forward_ios,
                                size: 16, color: Colors.black),
                          ],
                        )
                      ],
                    ),
                  ),
                );
              }).toList())
        ],
      ),
    );
  }
}
